package services.impl;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;

import services.XMLService;

import com.thoughtworks.xstream.XStream;

import entities.ItemCotizacion;
import entities.ListaPrecios;
import entities.PedidoVenta;
import entities.Proveedor;
import entities.xml.ExchangeFormatEntity;
import entities.xml.ItemPedidoCotizacionXML;
import entities.xml.ListaPreciosXML;
import entities.xml.ListasPreciosProveedoresXML;
import entities.xml.PedidoCotizacionXML;
import entities.xml.PedidoVentaXML;
import entities.xml.ProveedorXML;
@Stateless
public class XMLServiceBean implements XMLService{

	public XMLServiceBean() throws RemoteException{}
	
	@SuppressWarnings("rawtypes")
	public Object fromXML(String xml, String alias, Class clase){
		XStream xstream = new XStream();
		xstream.alias(alias, clase);
		xstream.autodetectAnnotations(true);
		return xstream.fromXML(xml);
	}
	
	public String toXML(Object obj){
		XStream xstream = new XStream();
		xstream.autodetectAnnotations(true);
		return xstream.toXML(obj);
	}

	public PedidoVenta getPedidoVenta(String xml){
		XStream xs = new XStream();
		xs.alias(PedidoVentaXML.getAlias(), PedidoVentaXML.class);
		xs.autodetectAnnotations(true);
		PedidoVentaXML pedidoVentaXML = (PedidoVentaXML) xs.fromXML(xml);
		PedidoVenta pedidoVenta = (PedidoVenta) pedidoVentaXML.toModelEntity();
		return pedidoVenta;
	}
	
	@Override
	public List<ItemCotizacion> getItemsCotizacionFromXML(String xml) {
		PedidoCotizacionXML pedidoCotizacionXML = (PedidoCotizacionXML) this.fromXML(xml, PedidoCotizacionXML.getAlias(), PedidoCotizacionXML.class);
		
		List<ItemPedidoCotizacionXML> itemsCotizacionXML = pedidoCotizacionXML.getListaItemPedidoCotizacion();
		List<ItemCotizacion> itemsCotizacion = new ArrayList<ItemCotizacion>();
		for(ItemPedidoCotizacionXML itemPedidoCotizacionXML : itemsCotizacionXML){
			ItemCotizacion itemCotizacion = itemPedidoCotizacionXML.toModelEntity();
			itemsCotizacion.add(itemCotizacion);
		}
		return itemsCotizacion;
	}

	@Override
	public List<ListaPrecios> getListasDePrecios(String listasXML) {
		List<ListaPrecios> listasPrecios = new ArrayList<ListaPrecios>();
		ListasPreciosProveedoresXML listasPrecioProveedoresXML = (ListasPreciosProveedoresXML) this.fromXML(listasXML, ListasPreciosProveedoresXML.getAlias(), ListasPreciosProveedoresXML.class);
		List<ProveedorXML> proveedoresXML = listasPrecioProveedoresXML.getProveedores();
		
		for(ProveedorXML proveedorXML : proveedoresXML){
			Proveedor proveedor = new Proveedor();
			proveedor.setRazonSocial(String.valueOf(proveedorXML.getId()));
			List<ListaPreciosXML> listasPreciosXML = new ArrayList<ListaPreciosXML>();
			listasPreciosXML.addAll(proveedorXML.getListas());
			for(ListaPreciosXML listaPreciosXML : listasPreciosXML){
				ListaPrecios listaPrecios = (ListaPrecios) this.toModelEntity(listaPreciosXML);
				listaPrecios.setProveedor(proveedor);
				listasPrecios.add(listaPrecios);
			}
		}
		return listasPrecios;
	}

	@Override
	public Object toModelEntity(ExchangeFormatEntity xmlEntity) {
		return xmlEntity.toModelEntity();
	}

	@Override
	public Object fromModelEntity(Object obj, ExchangeFormatEntity xmlEntity) {
		xmlEntity.fromModelEntity(obj);
		return xmlEntity;
	}

}
